#include <iostream>
#include <iomanip>
#include "CmdLineParser.h"
#include "BitHandlerOutput.h"
#include "LZP.h"
#include <ctime>

using namespace std;

int main(int argc, char**argv) {

	CmdLineParser* cmdLineParser = new CmdLineParser();
	int status = cmdLineParser->parse(argc, argv);
	int ti = time(0);
	delete cmdLineParser;
	switch (status) {
	case -1:
		cout << "Cantidad de argumentos invalida." << endl;
		break;
	case -2:
		cout << "Argumento invalido." << endl;
		break;
	case -3:
		cout << "El archivo no existe." << endl;
		break;
	case 1: {
			string nombreArchivo = (string)argv[2];
			ifstream is;
			is.open (nombreArchivo.c_str(), ios::binary);
			is.seekg (0, ios::end);
			int length = is.tellg();
			is.close();
			LZP* lzp = new LZP(length);
			cout << "Comprimiendo: " << nombreArchivo << endl;
			BitHandlerOutput* bho = new BitHandlerOutput(nombreArchivo.append(".lzp").c_str(), ios::binary, length);
			lzp->comprimir((string)argv[2], *bho);
			int tf = time(0);
			cout << " (comprimido " << fixed << setprecision(1) << ((float)(length-bho->tell())/length)*100
					<< fixed << setprecision(2) << "%, en ~" << difftime(tf, ti) << "s)" << endl;
			delete bho;
			delete lzp;
		} break;
	case 2: {
			string nombreArchivo = (string)argv[2];
			ifstream is;
			is.open(nombreArchivo.c_str(), ios::binary|ios::in);
			int length = 0;
			is.read((char *)&length, 4);//extraigo la longitud del archivo original
			is.close();
			LZP* lzp = new LZP(length);
			BitHandlerInput* bhi = new BitHandlerInput(nombreArchivo.c_str(), 4);
			cout << "Descomprimiendo: " << nombreArchivo.substr(0, nombreArchivo.length()-4) << endl;
			lzp->descomprimir(nombreArchivo.substr(0, nombreArchivo.length()-4), *bhi);
			int tf = time(0);
			cout << " (descomprimido en ~" << fixed << setprecision(2) << difftime(tf, ti) << "s)" << endl;
			delete bhi;
			delete lzp;
		} break;
	}
	return 0;
}
